From 858a6546768e5745b0b1d86b52c175efa5480f65 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 19 Dec 2011 12:39:53 +0100 Subject: [PATCH] x11: Avoid spurious focus events on grabs We want to avoid handling focus events for the private focus window, otherwise the keyboard grab taken by for example buttons will cause a spurious FOCUS_OUT/FOCUS_IN on the toplevel. The code that did this seems to have been lost in the XI2 transition for GTK3. This patch reapplies db4a6040afd3d1cabbb306037e811f37d62e2e76 which was backed out in 18406b7b04da088f8a3efe7cca5ac1647080dc0b to give developers a chance to get their X servers fixed. As we want to get this bugfix in for 3.4, we need to commit it now. https://bugzilla.gnome.org/show_bug.cgi?id=657578 --- gdk/x11/gdkdevicemanager-core-x11.c | 5 +++++ gdk/x11/gdkdevicemanager-xi2.c | 1 + gdk/x11/gdkdevicemanagerprivate-core.h | 3 +++ 3 files changed, 9 insertions(+) diff --git a/gdk/x11/gdkdevicemanager-core-x11.c b/gdk/x11/gdkdevicemanager-core-x11.c index 90630de432..38a225cafc 100644 --- a/gdk/x11/gdkdevicemanager-core-x11.c +++ b/gdk/x11/gdkdevicemanager-core-x11.c @@ -663,6 +663,7 @@ gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator, case FocusOut: if (window) _gdk_device_manager_core_handle_focus (window, + xevent->xfocus.window, device_manager->core_keyboard, NULL, xevent->type == FocusIn, @@ -794,6 +795,7 @@ _gdk_x11_event_translate_keyboard_string (GdkEventKey *event) */ void _gdk_device_manager_core_handle_focus (GdkWindow *window, + Window original, GdkDevice *device, GdkDevice *source_device, gboolean focus_in, @@ -818,6 +820,9 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window, if (!toplevel) return; + if (toplevel->focus_window == original) + return; + had_focus = HAS_FOCUS (toplevel); switch (detail) diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 6f93fd21b2..0b9dc19f71 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1561,6 +1561,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, GUINT_TO_POINTER (xev->sourceid)); _gdk_device_manager_core_handle_focus (window, + xev->event, device, source_device, (ev->evtype == XI_FocusIn) ? TRUE : FALSE, diff --git a/gdk/x11/gdkdevicemanagerprivate-core.h b/gdk/x11/gdkdevicemanagerprivate-core.h index 470a98a7d2..4de19d1e8f 100644 --- a/gdk/x11/gdkdevicemanagerprivate-core.h +++ b/gdk/x11/gdkdevicemanagerprivate-core.h @@ -18,6 +18,8 @@ #ifndef __GDK_DEVICE_MANAGER_PRIVATE_CORE_H__ #define __GDK_DEVICE_MANAGER_PRIVATE_CORE_H__ +#include + #include "gdkx11devicemanager-core.h" #include "gdkdevicemanagerprivate.h" @@ -36,6 +38,7 @@ struct _GdkX11DeviceManagerCoreClass }; void _gdk_device_manager_core_handle_focus (GdkWindow *window, + Window original, GdkDevice *device, GdkDevice *source_device, gboolean focus_in, -- 2.30.2